package com.company.ljh.easy;
//给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
//
// 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
//
// 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
//
// 示例：
//
// 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
//输出：7 -> 0 -> 8
//原因：342 + 465 = 807
//
// Related Topics 链表 数学
// 👍 5175 👎 0


import com.company.ljh.utils.ListNode;

public class 链表求和 {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //进一位
        boolean flag=false;
        ListNode listNode = new ListNode();
        ListNode head = listNode;
        while (l1 != null && l2 != null){
            if (listNode.next != null)
            listNode = listNode.next;
            int d = l1.val+l2.val;
            if (flag){
                d++;
                flag = false;
            }
            //判断进位
            if (d >= 10){
                flag = true;
                d = d %10;
            }
            listNode.val = d;
            listNode.next = new ListNode();
            l1 = l1.next;
            l2 = l2.next;
        }
        while (l1 != null){
            listNode = listNode.next;
            int d = l1.val;
            if (flag){
                d++;
                flag = false;
            }
            if (d >= 10){
                d = d %10;
                flag = true;
            }
            listNode.val = d;
            listNode.next = new ListNode();
            l1 = l1.next;
        }
        while (l2 != null){
            listNode = listNode.next;
            int d = l2.val;
            if (flag){
                d++;
                flag = false;
            }
            if (d >= 10){
                d = d %10;
                flag = true;
            }
            listNode.val = d;
            listNode.next = new ListNode();
            l2 = l2.next;
        }
        if (flag){
            listNode = listNode.next;
            //最后一位
            listNode.val = 1;
        }else{
            listNode.next = null;
        }

        return head;
    }

    public static void main(String[] args) {
        链表求和 question2 = new 链表求和();
        //第一个链表
        ListNode node1 = new ListNode(6);
        ListNode node2 = new ListNode(4);
        ListNode node3 = new ListNode(3);
        node1.next = node2;
        node2.next = node3;
        //第二个链表
        ListNode node4 = new ListNode(5);
        ListNode node5 = new ListNode(6);
        ListNode node6 = new ListNode(6);
        ListNode node7 = new ListNode(9);
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;
        ListNode node = question2.addTwoNumbers(node1, node4);
        while (node != null){
            System.out.println(node.val);
            node = node.next;
        }


    }
}
